package javabasic;

import java.util.ArrayList;
import java.util.Scanner;

/*
@date:2020.12.15
@author:dushuai
@title:创建学生管理系统，根据用户的指令返回正确的信息
* */
public class StudentManagerSystem {
    public static void main(String[] args) {
//        定义一个集合，用于管理学生信息
        ArrayList<Student> StudentArrayList = new ArrayList<Student>();
        Student stu = new Student();
//        定义一个while循环，只有当用户输入指令为5时，才会退出while循环
        studentloop:
        while (true) {
//        向用户展示系统首页信息
            System.out.println("-----欢迎访问山东大学学生管理系统------");
            System.out.println("1. 查看学生信息");
            System.out.println("2. 创建学生信息");
            System.out.println("3. 修改学生信息");
            System.out.println("4. 删除学生信息");
            System.out.println("5. 退出信息系统");
            System.out.println();
            System.out.println("请输入您的选择：");//此处需要通过导入Scanner包接收用户录入的信息
            Scanner sc = new Scanner(System.in);
            String choice = sc.nextLine();//定义一个字符串变量用于接收用户录入的信息
            //根据用户的输入判断应执行的指令
            switch (choice) {
                case "1":
                    //如果用户输入的指令是1，则调用查询学生信息的方法;
                    QueryStudentInfo(StudentArrayList);
                    break;
                case "2":
                    //如果用户输入的指令是2，则调用创建学生信息的方法;
                    CreateStudentInfo(StudentArrayList);
                    break;
                case "3":
                    AlterInfo(StudentArrayList);

                    break;
                case "4":
                    DeleteInfo(StudentArrayList);
                    break;

                case "5":
                    System.out.println("我将执行退出指令");
                    break studentloop;
                default:
                    System.out.println("您的输入有误，请重新输入");
                    break;
            }
        }
    }

    //    定义根据查看学生信息的方法，需要考虑如果信息为空返回相应提示，否则给出全部结果
    public static void QueryStudentInfo(ArrayList<Student> StudentArrayList) {
        if (StudentArrayList.size() == 0) {
            System.out.println("暂无学生信息，请先创建后再查询，谢谢！");
        } else {
//            查询结果不为空，先输出查询表头
            System.out.println("序号\t\t学号\t\t姓名\t\t年龄\t\t出生日期");// \t表示键盘tab键的效果
//            然后再循环打印出学生数据库中已有的学生信息
            for (int i = 0; i < StudentArrayList.size(); i++) {
                Student s = StudentArrayList.get(i);//定义一个学生类实例用于接收集合中元素的内存地址
//                通过调用Student类相应的get方法输出对应的结果
                System.out.println((i + 1) + "\t\t" + s.getSid() + "\t\t" + s.getName() + "\t\t" + s.getAge() + "\t\t" + s.getBirthday());
            }

        }
    }

    //定义创建学生信息的方法，需要考虑在创建前，先判断学号信息是否唯一，如果不唯一给出用户提示，创建成功也给用户提示
    public static void CreateStudentInfo(ArrayList<Student> StudentArrayList) {
//        先给用户提示，请用户录入学号信息
        System.out.println("请您输入学号：");
        Scanner sc = new Scanner(System.in);
//        定义一个字符串变量用于接收用户录入的学号信息
        String sid = sc.nextLine();
//        使用集合的contains方法，判断用户录入的学号是否存在
        int b = IsExistSid(StudentArrayList, sid);
        if (StudentArrayList.size() == 0 || b == -1) {
            System.out.println("请您输入学生姓名：");
            String name = sc.nextLine();
            System.out.println("请您输入学生年龄：");
            int age = sc.nextInt();
            System.out.println("请您输入学生出生日期：");
            String birthday = sc.next();//这里需要注意不能使用nextLine方法，因为此方法遇到回车
//           通过调用Student类的有参构造方法，将用户录入的学生信息赋予类的成员变量
            Student stu = new Student(sid, name, age, birthday);
//            调用StudentArrayList集合的add方法将stu实例的结果插入到集合中
            StudentArrayList.add(stu);
            System.out.println("恭喜您，创建学生信息成功！");
        } else {
            System.out.println("您输入的学号已存在，请验证后再次录入！");
        }

    }

    //定义一个修改学生信息的方法，如果sid不存在则提示用户
    public static void AlterInfo(ArrayList<Student> StudentArrayList) {
        System.out.println("请您输入需要修改信息的学号");
        Scanner sc = new Scanner(System.in);
        String sid = sc.nextLine();
//        调用IsExistSid方法获取用户输入的学号的索引值
        int userindex = IsExistSid(StudentArrayList, sid);
        if (userindex == -1) {
            System.out.println("您输入的学号信息不存在，请查证后再次输入");
        } else {
            System.out.println("请您输入学生姓名：");
            String name = sc.nextLine();
            System.out.println("请您输入学生年龄：");
            int age = sc.nextInt();
            System.out.println("请您输入学生出生日期：");
            String birthday = sc.next();//这里需要注意不能使用nextLine方法，因为此方法遇到回车
//           通过调用Student类的有参构造方法，将用户录入的学生信息赋予类的成员变量
            Student stu = new Student(sid, name, age, birthday);
//            调用StudentArrayList集合的add方法将stu实例的结果插入到集合中
            StudentArrayList.set(userindex, stu);
            System.out.println("恭喜您，学生信息修改成功！");
        }
    }

    //定义一个删除学生信息的方法，如果sid不存在则提示用户
    public static void DeleteInfo(ArrayList<Student> StudentArrayList) {
        System.out.println("请您输入需要删除信息的学号");
        Scanner sc = new Scanner(System.in);
        String id = sc.nextLine();
//        调用IsExistSid方法获取用户输入的学号的索引值
        int userindex = IsExistSid(StudentArrayList, id);
        if (userindex == -1) {
            System.out.println("您输入的学号信息不存在，请查证后再次输入");
        } else {
            StudentArrayList.remove(userindex);
            System.out.println("恭喜您，学生信息删除成功！");
        }
    }

    //定义一个方法，用于判断用户输入的sid在集合中是否已存在，因为后续需要通过sid的索引进行创建、修改、删除的操作，所以这里需要返回索引值
    public static int IsExistSid(ArrayList<Student> StudentArrayList, String sid) {
//        定义一个整形变量index，默认值为-1
        int index = -1;
//        循环获取集合中学号的信息
        for (int i = 0; i < StudentArrayList.size(); i++) {
            Student stu = StudentArrayList.get(i);
            String id = stu.getSid();
            if (id.equals(sid)) {
                index = i;//如果用户输入的sid在集合中已经存在，则将正确的索引号返回给index
            }

        }
        return index;
    }

}
